/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package p;

import java.io.*;
import java.util.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

// Flag que indica quando se deve terminar a execução.
public class Cli implements Serializable {

    private boolean fim = false;
    private BufferedReader entrada;
    private Socket ligacao;
    private ConnectionClientRecive tcli_recive;
    private ConnectionClientSend tcli_send;
    private ObjectOutputStream oos;
    private ObjectInputStream ois;
    private int tentativas;
    private String userLogin;

    Cli() {
    }

    void init() throws IOException {
        tentativas = 0;
        while (tentativas < 10) {
            try {
                ligacao = new Socket("localhost", 6000);
                entrada = new BufferedReader(new InputStreamReader(System.in));
                // saida = new PrintStream(ligacao.getOutputStream());
                oos = new ObjectOutputStream(ligacao.getOutputStream());
                ois = new ObjectInputStream(ligacao.getInputStream());
                // enviar nome do utilizador
                System.out.print("Entre com o seu nome: ");
                String meuNome = entrada.readLine();

                Registo Nome = new Registo(meuNome);

                //saida.println(meuNome);
                oos.writeObject(Nome);
                oos.flush();
                //Executar a thread de recepção de mensagens.
                tcli_recive = new ConnectionClientRecive(ligacao, ois, this);
                tcli_recive.start();
                System.out.println("criei uma thread Cliente para Leitura");

                tcli_send = new ConnectionClientSend(ligacao, oos, this);
                tcli_send.start();
                System.out.println("criei uma thread Cliente para Leitura");

                // loop principal: obtem uma linha digitada no teclado e envia para o servidor.
                int opcao;
                while (true) {
                    System.out.println("Escreva o que quer fazer:");
                    System.out.println("1- Registo");
                    System.out.println("2- Login");
                    System.out.println("3- Mostrar todas as mensagens que me enviaram");
                    System.out.println("4- enviar tweet (msg)");
                    System.out.println("5- procurar utilizadores");
                    System.out.println("6- seguir utilizadores");
                    System.out.println("7- mostrar lista de seguidores");
                    System.out.println("8- mostrar quem estou a seguir");
                    System.out.print("> ");
                    opcao = Integer.parseInt(entrada.readLine());
                    System.out.println();

                    if (opcao == 1) {
                        registar(opcao); //Registo
                    } else if (opcao == 2) {
                        login(opcao); //
                    } else if (opcao == 3) {
                        mostrarTodasAsMensagensQueMeEnviaram(opcao); //
                    } else if (opcao == 4) {
                        enviarTweet(opcao); //
                    } else if (opcao == 5) {
                        procurarUtilizadores(opcao); //
                    } else if (opcao == 6) {
                        seguirUtilizadores(opcao); //
                    } else if (opcao == 7) {
                        mostrarListaSeguidores(opcao); //
                    } else if (opcao == 8) {
                        mostrarQuemEstouSeguir(opcao); //
                    } else {
                        System.out.println("Mensagem Invalida...");
                    }

                    opcao = 0;

                }
            } catch (IOException e) {
                reStart();
            }
        }
    }

    private void reStart() {
        System.out.print("Problemas na ligaçao, queira aguardar..... ");
        for (int i = 5; i > 0; i--) {
            System.out.print(i + " ");
        }
        System.out.println();
        tentativas++;
    }

    private void registar(int opcao) throws IOException {
        boolean teste = true;
        while (teste) {
            System.out.println("Insira o seu Nick");
        }
        String nick = entrada.readLine();
        System.out.println("Insira a sua password");
        String pass = entrada.readLine();
        System.out.println("Insira a sua password (confirmação)");
        String pass2 = entrada.readLine();

        if (!pass.equals(pass2)) {
            teste = true;
        } else {
            teste = false;
        }

        Mensagem msg = new Mensagem(nick, opcao, pass);
        tcli_send.enviaMensagemThread(msg);
    }

    private void login(int opcao) throws IOException {
        System.out.println("Insira o seu Nick");
        String nick = entrada.readLine();
        System.out.println("Insira a sua password");
        String pass = entrada.readLine();
        /*FAZER VERIFICAÇAO DA PASS*/
        userLogin = nick;
        Mensagem msg = new Mensagem(nick, opcao, pass);
        tcli_send.enviaMensagemThread(msg);
    }

    private void mostrarQuemEstouSeguir(int opcao) throws IOException {
        Mensagem msg = new Mensagem(userLogin, opcao, "");
        tcli_send.enviaMensagemThread(msg);
    }

    private void enviarTweet(int tipoMensagem) throws IOException {
        System.out.println("Escreva a mensagem:");
        String msg = entrada.readLine();
        //  Mensagem m = new Mensagem(msg);
        if (msg != null) {
            Mensagem mensagem = new Mensagem(tipoMensagem, msg);
            tcli_send.enviaMensagemThread(mensagem);
        }
    }

    private void mostrarListaSeguidores(int opcao) throws IOException {
        Mensagem msg = new Mensagem(userLogin, opcao, "");
        tcli_send.enviaMensagemThread(msg);
    }

    private void seguirUtilizadores(int opcao) throws IOException {
        System.out.println("Introduza o Nick do User que quer seguir");
        String seguido = entrada.readLine();

        //TODO Verificar se Seguido existe
        Mensagem msg = new Mensagem(userLogin, opcao, seguido);
        tcli_send.enviaMensagemThread(msg);
    }

    private void procurarUtilizadores(int opcao) throws IOException {
        Mensagem msg = new Mensagem(userLogin, opcao, "");
        tcli_send.enviaMensagemThread(msg);
    }

    private void mostrarTodasAsMensagensQueMeEnviaram(int opcao) throws IOException {
        Mensagem msg = new Mensagem(userLogin, opcao, "");
        tcli_send.enviaMensagemThread(msg);
    }
}
